package business;

import java.util.ArrayList;
import java.util.Iterator;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Groupe;
import persistence.model.Seance;
import persistence.model.Semestre;
import persistence.model.Service;
import utility.Record;


public class GroupeBL {

	private Groupe g = null;
	private ArrayList<String> listeErreurs = new ArrayList<String>();
	
	public GroupeBL(int groupeId) {
		g = (Groupe) Groupe.all().get(groupeId);
	}


	public GroupeBL() {
	}


	/**
	 * @return retourne si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(){
		boolean estValide = true;
		boolean existeDeja = false;
		Semestre s = new Semestre(g.getIdSemestre());
		
		for (AbstractModel gr : Groupe.all())
		{
			Groupe grCourant = (Groupe)gr;
			
			if(grCourant.getNomGroupe() == g.getNomGroupe()){
				existeDeja = true;
				estValide = false;
			}
			if(existeDeja ){
				listeErreurs.add("Cette année étude existe déjà.");				
			}
		}
		if(g.getNomGroupe() == ""){
			estValide = false;
			listeErreurs.add("Le nom du groupe ne peut pas être vide.");	
		}
		if(g.getNombreEtudiant()< 0){
			estValide = false;
			listeErreurs.add("Le nombre d'étudiants ne peut pas être négatif.");	
		}			
		if(s.getGroupePromo() < g.getNombreEtudiant()){
			estValide = false;
			listeErreurs.add("Le nombre d'étudiants du groupe ne peut pas dépasser le nombre d'étudiants de la promo.");				
		}
		
	
		return estValide;
		
		
	}
	

	/**
	 * @return retourne si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		boolean estValide = true;
		
		/* Les réservations*/
		DataSet serviceSet = Service.all().filter("fk_service_groupe = " + g.getId());
		
		/*Ensemble des réservation futures, càd supperieur à la date du jour */
		Iterator<AbstractModel> it = serviceSet.iterator();
		
		if (it.hasNext()) {
			/* il existe une seance concernant ce groupe */
			estValide = false;
		}
		if (! estValide) {
			listeErreurs.add("Il y a au moins une réservation pour cette salle.");
		}
		
		System.out.println(listeErreurs);
		return estValide;
	}
	
	/**
	 * @param id : identifiant du groupe
	 * @param nom : nom du groupe
	 * @param nombreEtudiant : nombre d'étudiant du groupe
	 */
	public void ajouterGroupe(int id, String nom, int nombreEtudiant, int idSemestre, DataSet groupeIncompatible) {
		g = new Groupe(id, nom, nombreEtudiant, idSemestre, groupeIncompatible);
		g.save();
	}
	
	/**
	 * @param id : identifiant du groupe
	 * @param nom : nom du groupe
	 * @param nombreEtudiant : nombre d'étudiant du groupe
	 */
	public void modifierGroupe(int id, String nom, int nombreEtudiant, int idSemestre, DataSet groupeInCompatible) {
		g = new Groupe(id, nom, nombreEtudiant, idSemestre, groupeInCompatible);
		g.save(id);
	}
	
	/**
	 * @param id : identifiant du groupe
	 */
	public void supprimerGroupe() {
		g.delete();
	}
	
	/* Ensemble des getters et setters -> delegation vers la persistance */
	
	public int getIdGroupe() {
		return g.getId();
	}

	public void setIdGroupe(int idGroupe) {
		g.setId(idGroupe);
	}

	public String getNomGroupe() {
		return g.getNomGroupe();
	}

	public void setNomGroupe(String nomGroupe) {
		g.setNomGroupe(nomGroupe);
	}

	public int getNombreEtudiant() {
		return g.getNombreEtudiant();
	}

	public void setNombreEtudiant(int nombreEtudiant) {
		g.setNombreEtudiant(nombreEtudiant);
	}

	/**
	 * @return une liste de record
	 * chaque record comprenant le nom d'un groupe ainsi que son id
	 */
	public ArrayList<Record> getListeGroupe()
	{
		ArrayList<Record> listeGroupe = new ArrayList<Record>();
		for (AbstractModel f : Groupe.all())
		{
			Groupe groupeCourant = (Groupe)f;
			
			int idGroupe = groupeCourant.getId();
			String nomGroupe = groupeCourant.getNomGroupe();
			
			listeGroupe.add(new Record(idGroupe, nomGroupe));
		}
		
		return listeGroupe;
	}

	/**
	 * Accés à toutes les séances de la periode pour le semestre courant
	 * @param periode souhaitée
	 * @return ArrayListe de seance correspondant
	 */

	public ArrayList<SeanceBL> getListeSeances(int idPeriode) {
		ArrayList<SeanceBL> resultSeance = new ArrayList<SeanceBL>();
		for (AbstractModel seance : Seance.all().filter("fk_seance_periode = " + idPeriode))
		{
			//on a comparer les semestres des groupes, si ils sont égaux, on ajoutera le groupe promotion en plus du groupe courant
			Semestre semestrePeriode = ((Seance)seance).getService().getSEE().getMatiere().getUE().getSemestre();
			int semestreGroupe = this.g.getIdSemestre();
			Groupe gr = ((Seance)seance).getService().getGroupe();
			if(gr.getId() == this.getIdGroupe()){
				resultSeance.add(new SeanceBL((Seance) seance));
			}
			if(gr.getNomGroupe() == "Promotion" && semestreGroupe == semestrePeriode.getGroupePromo()){
				resultSeance.add(new SeanceBL((Seance) seance));
			}
		}
		
		return resultSeance;
	}
}
